﻿using IQReportes.ViewModels;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace IQReportes.Models.Logica
{
    public class LogicaPerfil
    {
        private GlobalDbContext db = new GlobalDbContext();
        
        public LogicaModulo logicaModulo = new LogicaModulo();
        public static int numFilas = 10;
        public static int cantPerfiles;

        public PerfilViewModel getPerfilById(string id)
        {
            PerfilViewModel perfil = getListPerfiles().Where(p => p.id.CompareTo(id) == 0).First();
            perfil.moduloTx = logicaModulo.getListaByIdAndTipo(Int32.Parse(id), 1);
            perfil.moduloPC = logicaModulo.getListaByIdAndTipo(Int32.Parse(id), 2);
            return perfil;
        }
        /*public bool getPerfilByUsuario(string usuario)
        {
            if ("ADMIN".CompareTo(usuario.ToUpper()) == 0)
                return true;
            else
                return false;
        }
        */
        public List<PerfilViewModel> getListPerfiles()
        {
            var perfiles = db.perfiles.ToList();
            return perfiles.Select( x=> new PerfilViewModel(x)).ToList();
        }

        public List<PerfilViewModel> getListPerfilesPagina(int pagina)
        {
            int skip = numFilas * (pagina - 1);
            List<PerfilViewModel> ListPerfiles = getListPerfiles();
            cantPerfiles = (int)Math.Ceiling(ListPerfiles.Count / (LogicaPerfil.numFilas * 1.0));
            var perfiles = ListPerfiles.Skip(skip).Take(numFilas);
            return perfiles.ToList();
        }

        public PerfilViewModel crearPerfil(PerfilViewModel perfil)
        {
            Perfil nuevo = perfil.extract();
            nuevo.inCantidadUsuarios = 0;
            nuevo.bAdmin = false;
            db.perfiles.Add(nuevo);
            db.SaveChanges();
            logicaModulo.crearModulosXPerfil(nuevo, perfil.moduloTx,1);
            logicaModulo.crearModulosXPerfil(nuevo, perfil.moduloPC,2);
            return perfil;
        }
        public PerfilViewModel actualizarPerfil(PerfilViewModel perfil)
        {
            //TODO actualizar relaciones
            Perfil actualizar = perfil.extract();
            db.Entry(perfil.extract()).State = EntityState.Modified;
            db.SaveChanges();
            logicaModulo.actualizarModulosXPerfil(actualizar, perfil.moduloTx);
            logicaModulo.actualizarModulosXPerfil(actualizar, perfil.moduloPC);
            return perfil;
        }
        public bool eliminarPerfil(string id)
        {
            //TODO elimginar relaciones
            Perfil perfil = db.perfiles.Find( Int32.Parse(id) );
            logicaModulo.eliminarModulosXPerfil(perfil);
            db.perfiles.Remove(perfil);
            db.SaveChanges();
            return true;
        }

        public List<SelectListItem> getListCombo()
        {
            List<PerfilViewModel> listaMarcas = getListPerfiles();

            List<SelectListItem> combo = new List<SelectListItem>();
            foreach (PerfilViewModel p in listaMarcas)
            {
                combo.Add(new SelectListItem() { Text = p.nombre, Value = p.id });
            }
            return combo;
        }
        public string tienePermisoVerPC(int modulo){
            return tienePermisoVer(modulo,2);
        }
        public string tienePermisoVerTx(int modulo)
        {
            return tienePermisoVer(modulo, 1);
        }
        public string tienePermisoVer(int modulo,int tipo)
        {
            string usuario = System.Web.HttpContext.Current.User.Identity.Name;
            int idPerfil = db.usuarios.Where(x => x.vcUsuario.CompareTo(usuario) == 0).First().idPerfil;
            var puedeVer = db.perfilesXModulos.Include(x => x.modulo).Where(x => x.idPerfil == idPerfil &&
                x.modulo.inTipo == tipo && x.modulo.inNumModulo == modulo).First().bVer;
            return puedeVer == true ? "" : "No posee permisos suficientes para ver este módulo";
        }

        public void aumentarCantidadPerfil(string id)
        {
            int idPerfil = Int32.Parse(id);
            var perfil = db.perfiles.Where(x => x.idPerfil == idPerfil).First();
            perfil.inCantidadUsuarios++;
            db.Entry(perfil).State = EntityState.Modified;
            db.SaveChanges();
        }
        public void actualizarCantidadPerfil(UsuarioBasicoViewModel usuario)
        {
            int idUsuario = Int32.Parse(usuario.id);
            int idPerfilAntiguo = db.usuarios.Where(x => x.idUsuario == idUsuario).First().idPerfil;
            int idPerfilNuevo = Int32.Parse(usuario.idPerfil);
            if (idPerfilAntiguo != idPerfilNuevo)
            {
                aumentarCantidadPerfil(idPerfilNuevo+"");
                disminuirCantidadPerfil(idPerfilAntiguo);
            }
        }
        public void disminuirCantidadPerfil(int id)
        {
            var perfil = db.perfiles.Where(x => x.idPerfil == id).First();
            perfil.inCantidadUsuarios--;
            db.Entry(perfil).State = EntityState.Modified;
            db.SaveChanges();
        }
    }
}